home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / src / exampleCode / opengl / lmwrap / igl / grafix.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-11  |  6.0 KB  |  219 lines

  1. /*
  2.  * Copyright (c) 1995, Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that the name of Silicon Graphics may not be used in any advertising or
  7.  * publicity relating to the software without the specific, prior written
  8.  * permission of Silicon Graphics.
  9.  *
  10.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
  11.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  12.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  13.  *
  14.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
  15.  * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
  16.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE
  17.  * POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN
  18.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19.  *
  20.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  21.  */
  22. /*----------------------------------------------------------------------------
  23.  * 
  24.  * file   : grafix.c 
  25.  * 
  26.  * Author : Yusuf Attarwala
  27.  * 
  28.  *---------------------------------------------------------------------------*/
  29. #include <X11/keysym.h>
  30. #include <strings.h>
  31. #include "Xmincludes.h"
  32. #include <X11/Xirisw/GlxMDraw.h>
  33. #include "globals.h"
  34. #include "lm.h"
  35.  
  36. #include <Xm/Protocols.h>
  37.  
  38. Arg args[40];
  39. int argcnt;
  40.  
  41. extern void doExit();
  42.  
  43. void
  44. createGraphics(parent)
  45. Widget parent;
  46. {
  47.     char *c;
  48.     Widget frameD,frameS;
  49.     Widget glwDbuffer,glwSbuffer;
  50.     Widget gf;
  51.  
  52.     static int firstTime = 1;
  53.     void gfxExposeCB(),
  54.          gfxResizeCB(),
  55.      gfxInitCB();
  56.          
  57.     Atom xaWmDeleteWindow = XmInternAtom(display,"WM_DELETE_WINDOW",TRUE);
  58.  
  59.     static GLXconfig glxConfigD [] = {
  60.         { GLX_NORMAL, GLX_DOUBLE, TRUE },
  61.         { GLX_NORMAL, GLX_RGB, TRUE },
  62.         { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG },
  63.         { 0, 0, 0 }
  64.     };
  65.  
  66.     static GLXconfig glxConfigS [] = {
  67.         { GLX_NORMAL, GLX_DOUBLE, FALSE },
  68.         { GLX_NORMAL, GLX_RGB, TRUE },
  69.         { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG },
  70.         { 0, 0, 0 }
  71.     };
  72.  
  73.     argcnt = 0;
  74.     XtSetArg(args[argcnt],XmNtitle,   "lmwarp - IRISGL");argcnt++;
  75.     XtSetArg(args[argcnt],XmNiconName,"lmwarpI");argcnt++;
  76.     XtSetArg(args[argcnt],XmNkeyboardFocusPolicy, XmPOINTER);argcnt++;
  77.     XtSetArg(args[argcnt],XmNdeleteResponse,      XmUNMAP);argcnt++;
  78.     XtSetArg(args[argcnt],XmNdefaultPosition,     False);argcnt++;
  79.     XtSetArg(args[argcnt],XmNminWidth,  300);argcnt++;
  80.     XtSetArg(args[argcnt],XmNminAspectX,  1);argcnt++;
  81.     XtSetArg(args[argcnt],XmNminAspectY,  1);argcnt++;
  82.     XtSetArg(args[argcnt],XmNmaxAspectX,  1);argcnt++;
  83.     XtSetArg(args[argcnt],XmNmaxAspectY,  1);argcnt++;
  84.  
  85.  
  86.     gf = XtCreatePopupShell("ui",
  87.                    topLevelShellWidgetClass,parent,args,argcnt);
  88.  
  89.     XmAddWMProtocolCallback(gf,xaWmDeleteWindow,doExit,0);
  90.  
  91.     /* double buffer widget */
  92.     argcnt = 0;
  93.     XtSetArg(args[argcnt], XmNbackground,BlackPixel(display,screen)); argcnt++;
  94.     frameD = XtCreateWidget("frameD", xmFrameWidgetClass,
  95.                              gf, args, argcnt);
  96.  
  97.     XtManageChild(frameD);
  98.  
  99.     argcnt = 0;
  100.     XtSetArg(args[argcnt], GlxNglxConfig, glxConfigD); argcnt++;
  101.     glwDbuffer = XtCreateWidget("gfx", glxMDrawWidgetClass,
  102.                                  frameD, args, argcnt);
  103.     XtManageChild(glwDbuffer);
  104.  
  105.     XtAddCallback(glwDbuffer, GlxNexposeCallback, gfxExposeCB, NULL);
  106.     XtAddCallback(glwDbuffer, GlxNresizeCallback, gfxResizeCB, NULL);
  107.     XtAddCallback(glwDbuffer, GlxNginitCallback,  gfxInitCB,   NULL);
  108.  
  109.     /* default to double buffer */
  110.     glw = glwDbuffer;
  111.     XtManageChild(gf);
  112.  
  113.     if (firstTime) {
  114.         firstTime = 0;
  115.     }
  116.  
  117.     GLXwinset(XtDisplay(glw), XtWindow(glw));
  118.     mmode(MPROJECTION);
  119.     ortho(-10.0,10.0,-10.0,10.0,-5.0,10.0);
  120.     mmode(MVIEWING);
  121.     loadmatrix(identity);
  122.     lmbind(LIGHT0,curLight);
  123.  
  124. }
  125.  
  126. void 
  127. gfxExposeCB(w,cd,cbs) 
  128. Widget w;
  129. XtPointer *cd;
  130. GlxDrawCallbackStruct *cbs;
  131. {
  132.     GLXwinset(XtDisplay(w), cbs->window);
  133.     drawScene();
  134. }
  135.  
  136. void
  137. gfxResizeCB(w,cd,draw_struct) 
  138. Widget w;
  139. XtPointer *cd;
  140. GlxDrawCallbackStruct *draw_struct;
  141. {
  142.     if (draw_struct->event != (XEvent *)NULL) {
  143.         window_width  = draw_struct->event->xconfigure.width;
  144.         window_height = draw_struct->event->xconfigure.height;
  145.     }
  146.     else {
  147.         argcnt = 0;
  148.         XtSetArg(args[argcnt], XmNwidth,  &window_width); argcnt++;
  149.         XtSetArg(args[argcnt], XmNheight, &window_height); argcnt++;
  150.         XtGetValues(w,args,argcnt);
  151.     }
  152.  
  153.     GLXwinset(XtDisplay(w), draw_struct->window);
  154.     viewport(0, (Screencoord) draw_struct->width-1,
  155.              0, (Screencoord) draw_struct->height-1);
  156.  
  157.     drawScene();
  158.  
  159.  
  160. }
  161.  
  162.  
  163. void
  164. gfxInitCB(w,cd,cbs) 
  165. Widget w;
  166. XtPointer *cd;
  167. GlxDrawCallbackStruct *cbs;
  168. {
  169.     GLXwinset(XtDisplay(w), cbs->window);
  170.  
  171.     /* do all the lmdefs here */
  172.  
  173.     lmdef(DEFMATERIAL,MAT_BRASS,SZ(mat_brass),mat_brass);
  174.     lmdef(DEFMATERIAL,MAT_REDPLASTIC,SZ(mat_redplastic),mat_redplastic);
  175.     lmdef(DEFMATERIAL,MAT_SILVER,SZ(mat_silver),mat_silver);
  176.     lmdef(DEFMATERIAL,MAT_GRNPLASTIC,SZ(mat_grnplastic),mat_grnplastic);
  177.  
  178.     lmdef(DEFLMODEL,  LTM_INFINITE,SZ(infinite),infinite);  
  179.     lmdef(DEFLMODEL,  LTM_LOCAL,SZ(local),local);  
  180.     lmdef(DEFLMODEL,  LTM_INF_TWO,SZ(infinite),infinite);  
  181.  
  182.     lmdef(DEFLIGHT,   LT_INF_WHITE,SZ(white_inf_light),white_inf_light);
  183.     lmdef(DEFLIGHT,   LT_INF_RED,SZ(red_inf_light),red_inf_light);
  184.  
  185.     zbuffer(TRUE);
  186. }
  187.  
  188. Boolean
  189. trackBallMotion()
  190. {
  191.     anglex += 20;
  192.     angley += 20;
  193.     anglez += 20;
  194.     if (anglex >= 3600) anglex = 0;
  195.     if (angley >= 3600) angley = 0;
  196.     if (anglez >= 3600) anglez = 0;
  197.  
  198.     refresh = 1;
  199.     drawScene();
  200.     return(0);
  201. }
  202.  
  203. void
  204. animation(flag)
  205. int flag;
  206. {
  207.     Boolean trackBallMotion();
  208.     static XtWorkProcId wpid;
  209.  
  210.     if (flag == 0) {
  211.         if (doTumble == 1) XtRemoveWorkProc(wpid);
  212.     doTumble = 0;
  213.     }
  214.     else if (doTumble == 0) {
  215.     doTumble = 1;
  216.     wpid = XtAppAddWorkProc(appContext,trackBallMotion,NULL);
  217.     }
  218. }
  219.